#include "../include/server.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include "../include/server.h"
#include "../include/user.h"
#include "../include/message.h"

// 处理客户端消息的完整实现
bool process_client_message(ChatServer *server, const char *message, int client_fd) {
    if (!server || !message || client_fd < 0) return false;
    
    char processed_message[2048];
    strncpy(processed_message, message, sizeof(processed_message) - 1);
    processed_message[sizeof(processed_message) - 1] = '\0';
    
    char command[50];
    char arg1[50];
    
    // 检查是否以斜杠开头，如果是则去掉斜杠
    if (processed_message[0] == '/') {
        memmove(processed_message, processed_message + 1, strlen(processed_message));
    }
    
    // 检查是否以@用户名开头的私聊消息格式
    if (processed_message[0] == '@') {
        // 提取接收者用户名
        char *receiver_start = processed_message + 1;
        char *content_start = strstr(receiver_start, " ");
        
        if (!content_start) {
            const char *err_msg = "发送失败：私聊格式错误，请使用 @用户名 <消息内容>\n";
            send(client_fd, err_msg, strlen(err_msg), 0);
            return true;
        }
        
        char receiver[50];
        char content[1024];
        
        // 提取接收者
        strncpy(receiver, receiver_start, content_start - receiver_start);
        receiver[content_start - receiver_start] = '\0';
        strcpy(content, content_start + 1);
        
        // 查找发送者
        User *sender = NULL;
        for (int i = 0; i < server->user_list->count; i++) {
            if (server->user_list->users[i].socket_fd == client_fd && server->user_list->users[i].online) {
                sender = &server->user_list->users[i];
                break;
            }
        }
        
        if (!sender) {
            const char *err_msg = "发送失败：请先登录\n";
            send(client_fd, err_msg, strlen(err_msg), 0);
            return true;
        }
        
        // 发送私聊消息
        if (send_private_message(server->user_list, sender->username, receiver, content)) {
            // 发送成功确认给发送者
            char confirm_msg[1500];
            snprintf(confirm_msg, sizeof(confirm_msg) - 1, "[私聊] 已发送给 %s: %s\n", receiver, content);
            send(client_fd, confirm_msg, strlen(confirm_msg), 0);
        } else {
            const char *err_msg = "发送失败：接收者不存在或不在线\n";
            send(client_fd, err_msg, strlen(err_msg), 0);
        }
        
        return true;
    }
    
    // 解析命令
    if (sscanf(processed_message, "%s %s", command, arg1) < 1) {
        return true; // 空消息，继续
    }
    
    // 根据命令执行相应操作
    if (strcmp(command, "login") == 0) {
        // 登录命令格式：login <用户名> <密码> 或 /login <用户名> <密码>
        char username[50], password[50];
        if (sscanf(processed_message, "%s %s %s", command, username, password) != 3) {
            const char *err_msg = "登录失败：参数格式错误，请使用 login <用户名> <密码> 或 /login <用户名> <密码>\n";
            send(client_fd, err_msg, strlen(err_msg), 0);
            return true;
        }
        
        // 执行登录
        User *user = login_user(server->user_list, username, password, client_fd);
        if (user) {
            const char *success_msg = "登录成功！\n";
            send(client_fd, success_msg, strlen(success_msg), 0);
            
            // 广播用户上线消息
            char online_msg[256];
            sprintf(online_msg, "用户 %s 已上线\n", username);
            broadcast_message(server->user_list, online_msg, client_fd);
        } else {
            const char *err_msg = "登录失败：用户名或密码错误\n";
            send(client_fd, err_msg, strlen(err_msg), 0);
        }
        
    } else if (strcmp(command, "register") == 0) {
        // 注册命令格式：register <用户名> <密码> 或 /register <用户名> <密码>
        char username[50], password[50];
        if (sscanf(processed_message, "%s %s %s", command, username, password) != 3) {
            const char *err_msg = "注册失败：参数格式错误，请使用 register <用户名> <密码> 或 /register <用户名> <密码>\n";
            send(client_fd, err_msg, strlen(err_msg), 0);
            return true;
        }
        
        // 执行注册
        if (register_user(server->user_list, username, password)) {
            // 保存用户数据到文件
            save_users_to_file(server->user_list, server->config.user_file);
            
            const char *success_msg = "注册成功！请使用登录命令登录\n";
            send(client_fd, success_msg, strlen(success_msg), 0);
        } else {
            const char *err_msg = "注册失败：用户名已存在或用户数量达到上限\n";
            send(client_fd, err_msg, strlen(err_msg), 0);
        }
        
    } else if (strcmp(command, "public") == 0) {
        // 公聊消息命令格式：public <消息内容> 或直接输入消息内容
        char content[1024];
        if (sscanf(processed_message, "%s %[^\n]", command, content) < 2) {
            // 尝试另一种格式解析
            char *content_start = strstr(processed_message, " ");
            if (!content_start) {
                const char *err_msg = "发送失败：请输入消息内容\n";
                send(client_fd, err_msg, strlen(err_msg), 0);
                return true;
            }
            strcpy(content, content_start + 1);
        }
        
        // 查找发送者
        User *sender = NULL;
        for (int i = 0; i < server->user_list->count; i++) {
            if (server->user_list->users[i].socket_fd == client_fd && server->user_list->users[i].online) {
                sender = &server->user_list->users[i];
                break;
            }
        }
        
        if (!sender) {
            const char *err_msg = "发送失败：请先登录\n";
            send(client_fd, err_msg, strlen(err_msg), 0);
            return true;
        }
        
        // 构建公聊消息
        Message msg;
        init_message(&msg, sender->username, NULL, content, MSG_PUBLIC);
        
        // 格式化消息
        char *formatted_msg = format_message(&msg);
        if (!formatted_msg) {
            const char *err_msg = "发送失败：内部错误\n";
            send(client_fd, err_msg, strlen(err_msg), 0);
            return true;
        }
        
        // 广播消息
        broadcast_message(server->user_list, formatted_msg, client_fd);
        
        // 保存消息到历史记录
        save_message_to_history(&msg, server->config.history_dir);
        
        free(formatted_msg);
        
    } else if (strcmp(command, "private") == 0) {
        // 私聊消息命令格式：private <接收者> <消息内容> 或 @<接收者> <消息内容>
        char receiver[50], content[1024];
        if (sscanf(processed_message, "%s %s %[^\n]", command, receiver, content) < 3) {
            // 尝试另一种方式解析
            char *receiver_start = strstr(processed_message, " ");
            if (!receiver_start) {
                const char *err_msg = "发送失败：参数格式错误，请使用 private <接收者> <消息内容> 或 @<接收者> <消息内容>\n";
                send(client_fd, err_msg, strlen(err_msg), 0);
                return true;
            }
            
            // 提取接收者
            char *content_start = strstr(receiver_start + 1, " ");
            if (!content_start) {
                const char *err_msg = "发送失败：请输入消息内容\n";
                send(client_fd, err_msg, strlen(err_msg), 0);
                return true;
            }
            
            strncpy(receiver, receiver_start + 1, content_start - receiver_start - 1);
            receiver[content_start - receiver_start - 1] = '\0';
            strcpy(content, content_start + 1);
        }
        
        // 查找发送者
        User *sender = NULL;
        for (int i = 0; i < server->user_list->count; i++) {
            if (server->user_list->users[i].socket_fd == client_fd && server->user_list->users[i].online) {
                sender = &server->user_list->users[i];
                break;
            }
        }
        
        if (!sender) {
            const char *err_msg = "发送失败：请先登录\n";
            send(client_fd, err_msg, strlen(err_msg), 0);
            return true;
        }
        
        // 发送私聊消息
        if (send_private_message(server->user_list, sender->username, receiver, content)) {
            // 发送成功确认给发送者
            char confirm_msg[1500];
            snprintf(confirm_msg, sizeof(confirm_msg) - 1, "[私聊] 已发送给 %s: %s\n", receiver, content);
            send(client_fd, confirm_msg, strlen(confirm_msg), 0);
        } else {
            const char *err_msg = "发送失败：接收者不存在或不在线\n";
            send(client_fd, err_msg, strlen(err_msg), 0);
        }
        
    } else if (strcmp(command, "online") == 0) {
        // 查看在线用户列表
        char *online_users = get_online_users(server->user_list);
        if (online_users) {
            char response[1024];
            sprintf(response, "在线用户列表：%s\n", online_users);
            send(client_fd, response, strlen(response), 0);
            free(online_users);
        } else {
            const char *err_msg = "获取在线用户列表失败\n";
            send(client_fd, err_msg, strlen(err_msg), 0);
        }
        
    } else if (strcmp(command, "logout") == 0) {
        // 用户登出
        User *user = NULL;
        for (int i = 0; i < server->user_list->count; i++) {
            if (server->user_list->users[i].socket_fd == client_fd && server->user_list->users[i].online) {
                user = &server->user_list->users[i];
                break;
            }
        }
        
        if (user) {
            // 执行登出
            logout_user(server->user_list, user->username);
            
            // 广播用户离线消息
            char offline_msg[256];
            sprintf(offline_msg, "用户 %s 已离线\n", user->username);
            broadcast_message(server->user_list, offline_msg, -1);
        }
        
        const char *logout_msg = "您已成功登出\n";
        send(client_fd, logout_msg, strlen(logout_msg), 0);
        
        return false; // 退出循环，关闭连接
        
    } else if (strcmp(command, "help") == 0) {
        // 显示帮助信息
        const char *help_msg = \
            "===== 聊天命令帮助 =====\n"\
            "login <用户名> <密码>   - 登录到服务器 (也可用 /login)\n"\
            "register <用户名> <密码> - 注册新用户 (也可用 /register)\n"\
            "public <消息>            - 发送公聊消息\n"\
            "private <用户名> <消息>  - 发送私聊消息 (也可用 @用户名 <消息>)\n"\
            "online                   - 查看在线用户列表\n"\
            "logout                   - 退出登录\n"\
            "help                     - 显示帮助信息\n"\
            "======================\n";
        send(client_fd, help_msg, strlen(help_msg), 0);
        
    } else {
        // 未知命令，作为公聊消息处理
        // 查找发送者
        User *sender = NULL;
        for (int i = 0; i < server->user_list->count; i++) {
            if (server->user_list->users[i].socket_fd == client_fd && server->user_list->users[i].online) {
                sender = &server->user_list->users[i];
                break;
            }
        }
        
        if (!sender) {
            const char *err_msg = "发送失败：请先登录\n";
            send(client_fd, err_msg, strlen(err_msg), 0);
            return true;
        }
        
        // 构建公聊消息
        Message msg;
        init_message(&msg, sender->username, NULL, processed_message, MSG_PUBLIC);
        
        // 格式化消息
        char *formatted_msg = format_message(&msg);
        if (!formatted_msg) {
            const char *err_msg = "发送失败：内部错误\n";
            send(client_fd, err_msg, strlen(err_msg), 0);
            return true;
        }
        
        // 广播消息
        broadcast_message(server->user_list, formatted_msg, client_fd);
        
        // 保存消息到历史记录
        save_message_to_history(&msg, server->config.history_dir);
        
        free(formatted_msg);
    }
    
    return true;
}

// 发送系统消息
void send_system_message(ChatServer *server, const char *message) {
    if (!server || !message) return;
    
    // 构建系统消息
    Message msg;
    init_message(&msg, "SYSTEM", NULL, message, MSG_SYSTEM);
    
    // 格式化消息
    char *formatted_msg = format_message(&msg);
    if (!formatted_msg) return;
    
    // 广播消息
    broadcast_message(server->user_list, formatted_msg, -1);
    
    // 保存消息到历史记录
    save_message_to_history(&msg, server->config.history_dir);
    
    free(formatted_msg);
}

// 主函数
int main(int argc, char *argv[]) {
    int port = 8888; // 默认端口号
    char user_file[100] = "./data/users.txt"; // 默认用户数据文件
    char history_dir[100] = "./data/history"; // 默认历史记录目录
    
    // 解析命令行参数
    if (argc > 1) {
        port = atoi(argv[1]);
    }
    if (argc > 2) {
        strcpy(user_file, argv[2]);
    }
    if (argc > 3) {
        strcpy(history_dir, argv[3]);
    }
    
    printf("正在启动聊天服务器...\n");
    printf("端口: %d\n", port);
    printf("用户文件: %s\n", user_file);
    printf("历史记录目录: %s\n", history_dir);
    
    // 初始化服务器
    ChatServer *server = init_server(port, user_file, history_dir);
    if (!server) {
        fprintf(stderr, "服务器初始化失败\n");
        return 1;
    }
    
    // 启动服务器
    start_server(server);
    
    // 清理资源
    stop_server(server);
    
    return 0;
}